package main

import (
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"io"
	"net/http"
	"os"
	"time"
)

// initLogrus 初始化日志系统
// 它创建或打开一个日志文件，设置日志输出目标，格式和级别
func initLogrus() {
	// 创建或打开日志文件
	logFile, err := os.OpenFile("gin.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		logrus.WithError(err).Fatal("打开日志文件失败")
	}

	// 设置日志输出目标为文件和控制台
	logrus.SetOutput(io.MultiWriter(logFile, os.Stdout))

	// 设置日志格式为带时间戳和颜色的文本格式
	logrus.SetFormatter(&logrus.TextFormatter{
		ForceColors:     true,
		FullTimestamp:   true,
		TimestampFormat: "2006-01-02 15:04:05",
	})

	// 设置日志级别
	logrus.SetLevel(logrus.InfoLevel)
}

// LoggerMiddleware 返回一个Gin的中间件函数，用于记录请求日志
// 它记录请求的方法，路径，状态码和处理时间
func LoggerMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 请求开始时间
		start := time.Now()

		// 处理请求
		c.Next()

		// 请求结束时间
		end := time.Now()

		// 记录日志
		logrus.WithFields(logrus.Fields{
			"method":  c.Request.Method,
			"path":    c.Request.URL.Path,
			"status":  c.Writer.Status(),
			"latency": end.Sub(start),
		}).Info("处理请求")
	}
}

func main() {
	initLogrus() // 初始化日志系统

	// 设置 Gin 模式
	gin.SetMode(gin.ReleaseMode)

	// 创建 Gin 路由器
	router := gin.New()

	// 使用自定义日志记录中间件
	router.Use(LoggerMiddleware())

	// 定义路由
	router.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello, Logrus with Gin!")
	})

	// 启动服务器
	router.Run(":8080")
}
